#pragma once

#include <string>
#include <memory>
#include <bitset>
#include <filesystem>

#include "OMIT_MeshAttrDS.h"

namespace OMIT_NAMESPACE
{
    namespace FileIO
    {
        template <typename Traits>
        void WriteOFF(std::shared_ptr<TMesh<Traits>> pMesh,
            const std::filesystem::path& filePath);

        // 建议写入成 binary 格式，ascii 格式导出的 stl 可能无法用 MeshLab 打开
        template <typename Traits>
        void WriteSTL(std::shared_ptr<TMesh<Traits>> pMesh,
            const std::filesystem::path& filePath,
            bool writeBinary = true);

        // 建议写成 ASCII 格式，以 binary 写入的文件可能无法在其他机器平台打开
        // 通过 vertAttrOPs 和 faceAttrOPs 分别控制写入文件的顶点属性集和面属性集
        template <typename Traits>
        void WriteVTK(std::shared_ptr<TMesh<Traits>> pMesh,
            const std::filesystem::path& filePath,
            bool writeBinary = true,
            OMIT_MESHATTR_OUTPUT_NUMOPS vertAttrOPs = OMIT_MESHATTR_OUTPUT_NUMOPS{ 0 },
            OMIT_MESHATTR_OUTPUT_NUMOPS faceAttrOPs = OMIT_MESHATTR_OUTPUT_NUMOPS{ 0 });
    }
}

#include "OMIT_MeshIO.inl"